// 1 导入nodejs-websocket包
const ws = require('nodejs-websocket');
const POST = 3000;

// 用一个变量记录连接上来的用户人数
let count=0;
// 用不同的变量去标记消息的类型
const TYPE_ENTER=0;
const TYPE_LEAVE=1;
const TYPE_MSG=2;


// 2 创建一个server
// 2.1 如果处理用户的请求
// 每次只要用用户连接，就会执行该函数，会给当前连接的用户创建一个connect对象
const server = ws.createServer(connect =>{
    count++;
    connect.userName=`用户${count}`
    console.log("有新用户连接了websocket服务，当前在线人数是：",count)
    // 1）广播告诉所有人，有人加入了聊天室
    broadcast({
        type:TYPE_ENTER,
        msg:`${connect.userName}进入了聊天室`,
        time:new Date().toLocaleTimeString()
    })

    // 每当接受到用户发来的数据，text方法就会被触发
    connect.on("text",data=>{
        console.log("接受到了用户发过来的消息：",data)
        // 2）当服务接收到某个用户的学习的时候，告诉所有人，他发送的信息的内容
        broadcast({
            type:TYPE_MSG,
            msg:data,
            time:new Date().toLocaleTimeString()
        })
    }) 



    // 2.2 监听websocket断开，close事件就会触发
    connect.on("close",()=>{
        console.log("websocket链接断开了")
        count--;
        // 广播告诉大家，有人离开
        broadcast({
            type:TYPE_LEAVE,
            msg:`${connect.userName}离开了聊天室`,
            time:new Date().toLocaleTimeString()
        })

    })
    // 注册一个error事件处理用户断开产生的错误信息
    connect.on("error",()=>{
        console.log("用户链接断开导致的异常")
    })
   

})


// 封装广播，给所有人发消息
function broadcast(msg){
    // server.connections:表示所有链接的用户
    server.connections.forEach(item =>{
        item.send(JSON.stringify(msg))
    })
}



// 监听服务端口
server.listen(POST,()=>{
    console.log("websocket服务启动成功！监听的端口是："+POST)
})